package cn.biplam.front.html.base;

import java.util.Map;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.front.html.base.Const.Overflow_Mode;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.htmlstyle.HtmlStyle;


/**
 * Html容器对象基础类(负责定义Html参数，生成对象标签内设置文本<BR>
 * 		(ID,页面属性,Style/ClassID)<BR>
 * 	如果一个对象需要装载Html对象，但不需要设置显示参数及绑定标签事件，可继承该类：<BR>
 * 	  1、调用该类的setProperty/setStyle方法设置对象参数<BR>
 * 	  2、调用该类的bind(Window_Event,String)设置标签内绑定事件
 * 	  3、<Font color=red>在实现类的getHtml方法中写入标签头后，调用super.writeTagSetting写入标签内设置文本</font>
 * @author 	WangSong 2009-3-31 下午03:49:39
 * @version 1.0
 */
public abstract class HtmlContainer extends Html {

	/**绑定脚本容器 */
	private KvMap<String, String> eventBinds;
	/**html属性集合 */
	private HtmlProperty Property=null;
	/**对象Css样式ID*/
	private String sCssID=null;
	/**对象页面ID */
	private String sID=null;
	/**CSS样式集合 */
	private HtmlStyle Style = null;
	/**对象title */
	private String title=null;
	/** 对象内容长度 */
	private int length=0;
	
	public HtmlContainer(){
		this.Property=new HtmlProperty();
		this.eventBinds=new KvMap<String, String>();
		this.Style=new HtmlStyle(HtmlStyle.Style_Type.Inner);
	}

	/**
	 * 构造方法 传入对象的页面ID初始化
	 * @param ID
	 */
	public HtmlContainer(String ID){
		this();
		this.sID=ID;
	}

	/**
	 * 构造方法 传入对象的页面ID和CSSID初始化
	 * @param ID
	 * @param cssID
	 */
	public HtmlContainer(String ID,String cssID){
		this();
		this.sID=ID;
		this.sCssID=cssID;
	}

	/**
	 * 设置客户端绑定的脚本命令(当前对象的声明标签内)
	 * @param event		绑定的事件ID
	 * @param script	绑定的脚本命令
	 * @throws ErrorMessage 
	 */
	public void bind(Window_Event event,String script) throws ErrorMessage{
		this.eventBinds.put(event.toString(), script);
	}
	
	/**
	 * 返回对象的CSS样式ID(class)
	 * @return	对象的CSS样式ID
	 */
	public String getCssID() {
		return sCssID;
	}

	/**
	 * 返回事件绑定脚本集合
	 * @return	事件绑定脚本集合
	 */
	protected KvMap<String, String> getEventBindSet() {
		return this.eventBinds;
	}

	/**
	 * 返回对象的页面ID
	 * @return	对象的页面ID
	 */
	public String getID() {
		return sID;
	}

	/**
	 * 返回Html对象属性值
	 * @param propertyName
	 * @return	Html对象属性值
	 */
	public String getProperty(String propertyName) {
		return Property.getProperty(propertyName);
	}

	/**
	 * 返回Html对象属性值集合
	 * @return 对象属性值集合
	 */
	protected HtmlProperty getPropertySet(){
		return this.Property;
	}

	/**
	 * 返回对象的CSS样式属性值
	 * @param styleName	样式属性名称
	 * @return	对象的CSS样式属性值
	 */
	public String getStyle(String styleName) {
		return this.Style.getStyle(styleName);
	}

	/**
	 * 返回对象的样式集合
	 * @return 对象的样式集合
	 */
	protected HtmlStyle getStyleSet(){
		return this.Style;
	}

	/**
	 * 返回对象的页面title
	 * @return	对象的页面Title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * 设置对象的CSS样式ID
	 * @param cssID	对象的CSS样式ID
	 */
	public void setCssID(String cssID) {
		sCssID = cssID;
	}

	/**
	 * 复制事件绑定脚本
	 * @param eventBinds
	 * @throws ErrorMessage
	 */
	protected void setEventBind(KvMap<String, String> eventBinds) throws ErrorMessage {
		for(Map.Entry<String, String> ite:eventBinds){
			this.eventBinds.put(ite.getKey(), ite.getValue());
		}
	}

	/**
	 * 设置对象的页面ID
	 * @param ID	页面ID
	 */
	public void setID(String ID) {
		sID = ID;
	}

	/**
	 * 设置当对象的内容超过其指定高度及宽度时如何管理内容
	 * @param mode	{@link Const}.Overflow_Mode
	 * @throws ErrorMessage
	 */
	public void setOverflow(Overflow_Mode mode) throws ErrorMessage{
		this.setStyle("overflow", mode.toString());
	}

	/**
	 * 设置当对象的内容超过其指定高度及宽度时如何管理内容
	 * @param mode	{@link Const}.Overflow_Mode
	 * @throws ErrorMessage
	 */
	public void setOverflowX(Overflow_Mode mode) throws ErrorMessage{
		this.setStyle("overflow-x", mode.toString());
	}

	/**
	 * 设置当对象的内容超过其指定高度及宽度时如何管理内容
	 * @param mode	{@link Const}.Overflow_Mode
	 * @throws ErrorMessage
	 */
	public void setOverflowY(Overflow_Mode mode) throws ErrorMessage{
		this.setStyle("overflow-y", mode.toString());
	}

	/**
	 * 设置Html对象属性值(用于对象属性复制)
	 * @param properts			属性集合 KvMap<String, String>
	 * @throws ErrorMessage
	 */
	public void setProperty(HtmlProperty properts) throws ErrorMessage{
		for(Map.Entry<String, String> property:properts.getPropertySet()){
			this.setProperty(property.getKey(), property.getValue());
		}
	}
	
	/**
	 * 设置Html对象属性值
	 * @param propertyName		属性名称
	 * @param propertyValue		属性值
	 * @throws ErrorMessage
	 */
	public void setProperty(String propertyName,String propertyValue) throws ErrorMessage {
		Property.setProperty(propertyName, propertyValue);
	}

	/**
	 * 复制样式集合
	 * @param styles
	 * @throws ErrorMessage
	 */
	public void setStyle(HtmlStyle styles) throws ErrorMessage{
		for(Map.Entry<String, String> style:styles.getStyleSet()){
			this.setStyle(style.getKey(), style.getValue());
		}
	}

	/**
	 * 设置对象的CSS样式属性值
	 * @param styleName			样式属性名称
	 * @param styleValue		样式属性值
	 * @throws ErrorMessage
	 */
	public void setStyle(String styleName,String styleValue) throws ErrorMessage {
		this.Style.setStyle(styleName, styleValue);
	}

	/**
	 * 设置对象的页面title
	 * @param title
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * 设置该对象的内容宽带
	 * @param length	单位：px
	 */
	public void setLength(int length){
		this.length=length;
	}
	
	/**
	 * 获取对象内容宽度
	 * @return	int
	 */
	public int getLength(){
		return this.length;
	}
	
	/**
	 * 写入对象的标签内设置文本(Property/Style/Bind)
	 */
	protected void writeTagSetting(StringBuilder sb) throws ErrorMessage{
		if(this.sID!=null){
			sb.append("ID='");
			sb.append(this.sID);
			sb.append("' ");
		}
		if(this.sCssID!=null){
			sb.append("class='");
			sb.append(this.sCssID);
			sb.append("' ");
		}
		if(this.title!=null){
			sb.append("title='");
			sb.append(this.title);
			sb.append("' ");
		}
		sb.append(this.Property.draw());
		sb.append(this.Style.draw());
		if(this.eventBinds.size()>0){
			for(Map.Entry<String, String> ite:this.eventBinds){
				sb.append(ite.getKey());
//				sb.append("=\"javascript:");
				sb.append("=\"");
				sb.append(ite.getValue());
				sb.append("\" ");
			}
		}
	}

}
